/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import BaseDatos.GestorBD;
import Util.GestorErrores;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Vector;
import Util.Varios;

/**
 * Modela la gestión de la tabla Compra
 * @author Javi
 */
public class Compra implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "Compra";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Compras de Bienes mediante un préstamo";

    //Atributos de la tabla Compra
    private int _iIdCliente;
    private int _iIdBien;
    private Date _dFechaCompra;
    private String _sTipoFinan;
    private int _iAniosPago;
    private int _iImporteMensual;
    private String _sTipoInteres;
    private float _fProbMorosidad;
    private String _sAutorizada;
    private String _sEstudioMorosidad;
    //Nos permite distinguir cuando es un prestamo o una mera solicitud de préstamo
    private boolean _bConcedido;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " ORDER BY IdCliente, IdBien");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (IdCliente, IdBien, FechaCompra, TipoFinan, AniosPago," +
            " ImporteMensual, TipoInteres, ProbMorosidad, Autorizada, EstudioMorosidad, Concedido) VALUES (" +
            this._iIdCliente + ", " + this._iIdBien + ", '" + Varios.dateToString (this._dFechaCompra) + "', '" +
            this._sTipoFinan + "', " + this._iAniosPago + ", " + this._iImporteMensual + ", '" + this._sTipoInteres +
            "', " + this._fProbMorosidad + ", '" + this._sAutorizada + "', '" +
            this._sEstudioMorosidad + "', " + Varios.booleanToInteger(this._bConcedido) + ")";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }


    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET FechaCompra = '" + Varios.dateToString (this._dFechaCompra) + "', " +
            " TipoFinan = '" + this._sTipoFinan + "', " +
            " AniosPago = " + this._iAniosPago + ", " +
            " ImporteMensual = " + this._iImporteMensual + ", " +
            " TipoInteres = '" + this._sTipoInteres + "', " +
            " ProbMorosidad = " + this._fProbMorosidad + "," +
            " Autorizada = '" + this._sAutorizada + "', " +
            " EstudioMorosidad = '" + this._sEstudioMorosidad + "', " +
            " Concedido = " + Varios.booleanToInteger(this._bConcedido) +
            " WHERE IdCliente = " + this._iIdCliente + " AND IdBien = " + this._iIdBien;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro de la Entidad Auxiliar
     */
    public boolean delete (){
        String sSQL = "DELETE FROM " + this._sNombreTabla +
            " WHERE IdCliente = " + this._iIdCliente + " AND IdBien = " + this._iIdBien;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        if ( this._sTipoFinan.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El tipo de financiación es obligatorio");
        if ( this._iAniosPago == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El número de anualidades de pago es obligatorio");
        else if ( this._iAniosPago >50 )
            GestorErrores.getInstancia().getvErrores().add ("El número de anualidades de pago no puede exceder de 50");
        if ( this._iImporteMensual == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El importe del pago mensual es obligatorio");
        if ( this._sTipoInteres.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El tipo de interés es obligatorio");
        //Validación de Prestamo
        if (this._bConcedido){
            if ( this._sEstudioMorosidad.compareTo("") == 0 )
                GestorErrores.getInstancia().getvErrores().add ("Es obligatorio indicar un valor en la morosidad");
        }else   //Validación de solicitud de préstamo
            if ( this._sEstudioMorosidad.compareTo("1") == 0 ||
                    this._sEstudioMorosidad.compareTo("2") == 0)
                GestorErrores.getInstancia().getvErrores().add ("La información de morosidad solo se puede especificar en los Préstamos concedidos");

        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        this.inicializa();
        int iIndice = Varios.getPosCadena(columnIdentifiers, "IdCliente");
        this._iIdCliente = Integer.parseInt( dataRow.get(iIndice).toString() );
        iIndice = Varios.getPosCadena(columnIdentifiers, "IdBien");
        this._iIdBien = Integer.parseInt( dataRow.get(iIndice).toString() );
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();
        for (int i=0; i < columnIdentifiers.size(); i++){
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdCliente") == 0 )
                resul.add( this._iIdCliente );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdBien") == 0 )
                resul.add( this._iIdBien );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("FechaCompra") == 0 )
                resul.add( this._dFechaCompra );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("TipoFinan") == 0 )
                resul.add( this._sTipoFinan );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("AniosPago") == 0 )
                resul.add( this._iAniosPago );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ImporteMensual") == 0 )
                resul.add( this._iImporteMensual );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("TipoInteres") == 0 )
                resul.add( this._sTipoInteres );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ProbMorosidad") == 0 )
                resul.add( this._fProbMorosidad );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Autorizada") == 0 )
                resul.add( this._sAutorizada );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("EstudioMorosidad") == 0 )
                resul.add( this._sEstudioMorosidad );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Concedido") == 0 )
                resul.add( this._bConcedido );
        }
        return resul;
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + 
                " WHERE IdCliente = " + this._iIdCliente + " AND IdBien = " + this._iIdBien);
            if ( rs.next() ) {
                this._dFechaCompra= rs.getDate("FechaCompra");
                this._sTipoFinan= rs.getString("TipoFinan");
                this._iAniosPago= rs.getInt("AniosPago");
                this._iImporteMensual= rs.getInt("ImporteMensual");
                this._sTipoInteres= rs.getString("TipoInteres");
                this._fProbMorosidad= rs.getFloat("ProbMorosidad");
                this._sAutorizada= rs.getString("Autorizada");
                this._sEstudioMorosidad= rs.getString("EstudioMorosidad");
                this._bConcedido = Varios.integerToBoolean(rs.getInt("Concedido"));
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa (){
        this._iIdCliente = 0;
        this._iIdBien = 0;
        this._dFechaCompra= new Date();
        this._sTipoFinan = "";
        this._iAniosPago = 0;
        this._iImporteMensual =0;
        this._sTipoInteres = "";
        this._fProbMorosidad =0;
        this._sAutorizada= "";
        this._sEstudioMorosidad= ""; 
        this._bConcedido= false;
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public int getiIdCliente() {
        return _iIdCliente;
    }

    public void setiIdCliente(int _iIdCliente) {
        this._iIdCliente = _iIdCliente;
    }

    public String getsAutorizada() {
        return _sAutorizada;
    }

    public void setsAutorizada(String _sAutorizado) {
        this._sAutorizada = _sAutorizado;
    }

    public Date getdFechaCompra() {
        return _dFechaCompra;
    }

    public void setdFechaCompra(Date _dFecha) {
        this._dFechaCompra = _dFecha;
    }

    public float getfProbMorosidad() {
        return _fProbMorosidad;
    }

    public void setfProbMorosidad(float _fProbMorosidad) {
        this._fProbMorosidad = _fProbMorosidad;
    }

    public int getiAniosPago() {
        return _iAniosPago;
    }

    public void setiAniosPago(int _iAniosPago) {
        this._iAniosPago = _iAniosPago;
    }

    public int getiIdBien() {
        return _iIdBien;
    }

    public void setiIdBien(int _iIdBien) {
        this._iIdBien = _iIdBien;
    }

    public int getiImporteMensual() {
        return _iImporteMensual;
    }

    public void setiImporteMensual(int _iImporteMensual) {
        this._iImporteMensual = _iImporteMensual;
    }

    public String getsTipoFinan() {
        return _sTipoFinan;
    }

    public void setsTipoFinan(String _sTipoFinan) {
        this._sTipoFinan = _sTipoFinan;
    }

    public String getsTipoInteres() {
        return _sTipoInteres;
    }

    public void setsTipoInteres(String _sTipoInteres) {
        this._sTipoInteres = _sTipoInteres;
    }

    public String getsEstudioMorosidad() {
        return _sEstudioMorosidad;
    }

    public void setsEstudioMorosidad(String _sEstudioMorosidad) {
        this._sEstudioMorosidad = _sEstudioMorosidad;
    }

    public boolean isbConcedido() {
        return _bConcedido;
    }

    public void setbConcedido(boolean _bCasoReal) {
        this._bConcedido = _bCasoReal;
    }
    
}
